(*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *)

open! IStd

val issue_log : IssueLog.t ref

type linter =
  { condition: CTLTypes.t
  ; issue_desc: CIssue.t
  ; whitelist_paths: ALVar.t list
  ; blacklist_paths: ALVar.t list }

val filter_parsed_linters : linter list -> SourceFile.t -> linter list

val pp_linters : Format.formatter -> linter list -> unit

(** map used to expand macro. It maps a formula id to a triple (visited, parameters, definition).
    Visited is used during the expansion phase to understand if the formula was already expanded
    and, if yes we have a cyclic definifion *)
type macros_map = (bool * ALVar.t list * CTLTypes.t) ALVar.FormulaIdMap.t

(** Map a path name to a list of paths. *)
type paths_map = ALVar.t list ALVar.VarMap.t

(* Module for warnings detected at translation time by the frontend *)

val invoke_set_of_checkers_on_node :
  linter list -> CLintersContext.context -> Ctl_parser_types.ast_node -> unit
(** Run frontend checkers on an AST node *)

val build_macros_map : CTL.clause list -> macros_map

val build_paths_map : (string * ALVar.alexp list) list -> paths_map

val expand_checkers : macros_map -> paths_map -> CTL.ctl_checker list -> CTL.ctl_checker list

val create_parsed_linters : string -> CTL.ctl_checker list -> linter list

val remove_new_lines_and_whitespace : string -> string
